package kin.test;


import java.util.ArrayList;
import java.util.ConcurrentModificationException;

import java.util.Iterator;
import java.util.List;





import kin.bean.security.Module;




public class Tree 
{
  private List<Module> roots=new ArrayList<Module>();
    
     
  public static void bb(){
	  
  }
  
  
    
    public List<Module> getRoots() {
	return roots;
}



public void setRoots(List<Module> roots) {
	this.roots = roots;
}



	public  void buildTree(List<Module> ms,Module parent) {
    	Iterator it=ms.iterator();
    	 try{
    	 if(roots==null||roots.size()==0)
   	  {
    
   	  while(it.hasNext())
   	  {
   	   Module m=(Module) it.next();
   	  
   	  if(m.getParent()==null)
   	  {
   		  
   		 
   	  roots.add(m);
   	   
   	it.remove();
   	  ms.remove(m);
   	 
   	buildTree(ms,m);
   	  }
   
   	  }  
   	 return ;
   	  }else{
   		 
   		  
   		  while(it.hasNext())
   		  {
   			 
   		 Module m= (Module) it.next();
   		
   		  if(m.getParent()==null){
   			  if(!roots.contains(m)){
   			 
   			 roots.add(m);
   		  it.remove();
   			 ms.remove(m);
   			buildTree(ms,m);
   			  }
   		  }
   		  else{
   			if(m.getParent().getModule_id()==parent.getModule_id()){
   		  
   		     if(null!=parent.getChildren()&&parent.getChildren().size()>0){
   		    
   		    	if(!parent.getChildren().contains(m)){
   		    	 parent.getChildren().add(m);
   		    	it.remove();
   		    	 ms.remove(m);
   		    	 buildTree(ms,m);
   		    	}
   		    	
   		     }else{
   		    	
   		    	List<Module> ll=new ArrayList<Module>();
   		    	 ll.add(m);
   		    	 parent.setChildren(ll);
   		    	 it.remove();
   		    	 ms.remove(m);
   		    
   		    	 buildTree(ms,m);
   		     }
   			}else{
   			 for(Module mms:this.getRoots()){
   				if(m.getParent().getModule_id()==mms.getModule_id()){
   		   		  
   	   		     if(mms.getChildren()!=null&&mms.getChildren().size()>0){
   	   		    
   	   		    	
   	   		         if(!mms.getChildren().contains(m)){
   	   		    	 mms.getChildren().add(m);
   	   		    	it.remove();
   	   		    	 ms.remove(m);
   	   		    	 buildTree(ms,m);
   	   		        }
   	   		         
   	   		     }else{
   	   		    	
   	   		    	 List<Module> ll=new ArrayList<Module>();
   	   		    	 ll.add(m);
   	   		    	 mms.setChildren(ll);
   	   		    	 it.remove();
   	   		    	 ms.remove(m);
   	   		    
   	   		    	 buildTree(ms,m);
   	   		     }
   	   			} 
   			 }
   			}
   		
   		  }
   		  
   		  if(ms==null||ms.size()==0){
   			  return;
   		  }
   		  
   		  }
   
   	  }
    
    	 }catch(ConcurrentModificationException e){
    		
    		
  		  }
    }
    
    
    

	public static void main(String[] args) {
    	//Set<Module> ms=new HashSet<Module>();
		List<Module> ms=new ArrayList<Module>();
	/*for(int i=0;i<5;i++){
		Module m=new Module();
		m.setModule_name("p"+i);
		ms.add(m);
		for(int a=0;a<3;a++){
			Module c=new Module();
			c.setModule_name("c"+a);
			c.setParent(m);
			ms.add(c);
		}
	}*/
	Module m1=new Module();
	m1.setModule_id(1);

	Module m2=new Module();
	m2.setModule_id(2);
	m2.setParent(m1);
	Module m3=new Module();
	m3.setModule_id(3);
	m3.setParent(m1);
	Module m4=new Module();
	m4.setModule_id(4);

	Module m5=new Module();
	m5.setModule_id(5);
	m5.setParent(m4);
	Module m6=new Module();
	m6.setParent(m4);
	m6.setModule_id(6);
	Module m7=new Module();
	m7.setModule_id(7);
	m7.setParent(m4);
	Module m8=new Module();
	m8.setModule_id(8);
	m8.setParent(m4);
	Tree t=new Tree();
	ms.add(m1);
	ms.add(m2);
	ms.add(m3);
	ms.add(m4);
	ms.add(m5);
	ms.add(m6);
	ms.add(m7);
	ms.add(m8);

	
	for(Module kk:ms){
		System.out.println("module_id:"+kk.getModule_id());
	}
	t.buildTree(ms, null);
	
	
	List<Module> ls=t.getRoots();
	System.out.println("parent total:"+ls.size());
	Iterator it=ls.iterator();
	for(Module p:t.getRoots())
	
		if(p.getChildren()!=null){
			for(Module c:p.getChildren()){
				
				System.out.println("parent_id:"+p.getModule_id()+",children_id:"+c.getModule_id());
			
		
	}}

	
	}
}
